Rank N Polymorphism
参考
以下も殆ど同じ使われ方をする
簡潔に
forall aの係る位置の話をしている
高階関数であるかどうかはあんまり関係ない
Nが2以上なら関係あるかmrsekut.icon
rank-1
code:hs
rank1 :: forall a. (a -> Int) -> Int
forallが全体にかかっている
rank-2
code:hs
rank2 :: (forall a. a -> Int) -> Int
forallが引数の関数にのみかかっている
例えば、rank-1 typeの例にlengthがある
code:hs
length :: forall a. a -> Int 任意の型の配列を取って、その長さを返す
ここで、lengthのような関数を引数に取る高階関数を考える
これも上と同じrank-1 typeな関数
以下は型errorになる
code:hs
rank1' :: forall a. (a -> Int) -> Int rank-2 typeを使えばerrorにはならない
code:hs
rank2 :: (forall a. a -> Int) -> Int Haskell標準では多相関数をfrist class objectにできない rank2以上からできるようになる
rank-3 type
rank-2 typeな関数をfirst class objectとして扱う関数
code:hs
f3 :: ((forall a. a -> a) -> Int) -> Bool -> Bool
rank-(n-1) typeな関数をfirst class objectとして扱う関数
haskell wikiでは
a rank-n type is a function that has at least one rank-(n-1) argument but no arguments of any higher rank. ref 少なくとも1つのrank-(n-1) typeな関数を引数に持ち、それより大きいrankの引数を持たないもの
これが正解なのかは不明mrsekut.icon
「引数」と限定している?
下のrank typeを包含しない?
rank-1 typeの関数 $ \notinrank-3 typeの関数
コレはどういう意味になる?
code:hs
rank2 :: (forall a. (a -> a)) -> a -> a
rank2 g x = g x
カッコ内のaと、括弧外のaって違うもの?
明示的にforallを付けたらどうなる?
これって絶対に呼び出せない関数になる?
code:hs
aa1 = rank2 rank1 2 -- error
aa2 = rank2 rank0 2 -- error
とか
system fの型推論は決定不能なのでhaskell98では採用していない
ランク1多相
ランク2多相
ランクN多相